﻿/**
 * @file mb_time.c
 * @brief this is a brief description
 * @details this is the detail description.
 * @author fulong 
 * @data 7/22/2014
 * @version 1.0
 * @par Copyright (c):
 * @par First build
 *     version: fulong 
 *     data: 7/22/2014
 */
#include "mb_time.h"
#include "../../../dev/uart.h"


#ifdef MODBUS_ENABLE
extern void rtu_time_hook(void);

extern uint8 rtu_receive_status;

/*!< 超时设定数据结构 */
typedef struct {
    uint32 frame_char_counter; /*!< 接收帧中每个字符的超时时间设置,这个值为0时,意思是无视时间管理 */
#ifdef MODBUS_RTU_MODE
    uint32 counter3_5; /*!< RTU模式中,启动与结束的时间管理,这个值为0时,不会在启动接收与结束接收这两个状态进行切换 */
#endif
    uint8 frame_char_timeout; /*!< 超时状态 */
}mb_timeout_struct;

mb_timeout_struct mb_timeout;
/*! \brief 时间管理初始化函数,将用到的变量操作变为默认值.
 * \param
 * \retrun
 */
void mb_time_manage_init(void)
{
    mb_timeout.frame_char_timeout = 0;
    mb_timeout.frame_char_counter = 0;
#ifdef MODBUS_RTU_MODE
    mb_timeout.counter3_5 = 0;
#endif
}
/*! \brief 查看时间是否超时,并做响应处理
 * \param
 * \retrun
 */
void mb_check_timeout(void)
{
    if (mb_timeout.frame_char_counter > 0)
    {
        mb_timeout.frame_char_counter--;
        if (mb_timeout.frame_char_counter == 0)
        {
            /*帧间的字符超时则会将这个状态位置1*/
            mb_timeout.frame_char_timeout = 1;
        }
    }
#ifdef MODBUS_RTU_MODE
    /*RTU模式专有,用来切换启动接收与停止接收两个状态*/
    if (mb_timeout.counter3_5 > 0)
    {
        mb_timeout.counter3_5--;
        if (mb_timeout.counter3_5 == 0)
        {
            if (rtu_receive_status == RTU_START)
            {
                rtu_receive_status = RTU_STOP;
                /*执行结束处理*/
                rtu_time_hook();
                
            } else
            {
                rtu_receive_status = RTU_START;
            }
        }
    }
#endif
}
/*! \brief 设置帧间字符超时间间隔
 * \param  time 设置间隔大小
 * \retrun
 */
void mb_set_frame_char_timeout(uint32 time)
{
    if (mb_timeout.frame_char_timeout == 0)
    {
        mb_timeout.frame_char_counter = time;
    }
}
#ifdef MODBUS_RTU_MODE
/*! \brief 设置启动结束状态切换的时间间隔
 * \param time 设置间隔大小
 * \retrun
 */
void mb_set_rtu_timeout(uint32 time)
{
    if (mb_timeout.counter3_5 == 0)
    {
        mb_timeout.counter3_5 = time;
    }
}
#endif
/*! \brief 取得帧间字符超时的当前状态
 * \param
 * \retrun 返回1,则为超时状态,0则为正常状态.
 */
uint8 mb_get_frame_char_timeout_status(void)
{
    return (mb_timeout.frame_char_timeout);
}
/*! \brief 重置帧间字符的超时状态.
 * \param
 * \retrun
 */
void mb_frame_char_timeout_clr(void)
{
    mb_timeout.frame_char_timeout = 0;
}
#endif
